package struts;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import pessoal.Endereco;
import pessoal.funcionario.Funcionario;
import pessoal.funcionario.exception.FuncionarioExistenteException;
import pessoal.funcionario.exception.FuncionarioInvalidoException;
import util.CampoObrigatorioException;
import util.ErroAcessoRepositorioException;
import fachada.Fachada;

public class FuncionarioDispatchAction extends DispatchAction{
	
	public ActionForward formFuncionario(ActionMapping mapping,ActionForm form, 
			HttpServletRequest request,	HttpServletResponse response){
		return mapping.findForward("formFuncionario");
	}
	
	public ActionForward formAlterar(ActionMapping mapping,ActionForm form, 
			HttpServletRequest request,	HttpServletResponse response){
		return mapping.findForward("formAlterar");
	}
	
	public ActionForward listar(ActionMapping mapping,ActionForm form, 
			HttpServletRequest request,	HttpServletResponse response){
		return mapping.findForward("listar");
	}
	
	public ActionForward alterar(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request,	HttpServletResponse response){
		String nome = request.getParameter("nome");
		String cpf = request.getParameter("cpf");
		String rg = request.getParameter("rg");
		double salario = Double.parseDouble(request.getParameter("salario"));
		String rua = request.getParameter("rua");
		String numero = request.getParameter("numero");
		String complemento = request.getParameter("complemento");
		String bairro = request.getParameter("bairro");
		String cidade = request.getParameter("cidade");
		String cep = request.getParameter("cep");
		String uf = request.getParameter("uf");
		try {
			Fachada.obterInstancia().atualizarFuncionario(new Funcionario(cpf,nome,
					rg, new Endereco(rua,numero,complemento,bairro,cidade,cep,uf),salario));
		} catch (FuncionarioInvalidoException e) {
			request.setAttribute("mensagem", e.getMessage());
			return mapping.findForward("erro");
		} catch (ErroAcessoRepositorioException e) {
			request.setAttribute("mensagem", e.getMessage()+", "+e.getExcecaoInterna().getMessage());
			return mapping.findForward("erro");
		}
		
		return mapping.findForward("listar");
	}
	
	public ActionForward remover(ActionMapping mapping,ActionForm form, 
			HttpServletRequest request,	HttpServletResponse response){
		try {
			Fachada.obterInstancia().excluirFuncionario(request.getParameter("cpf"));
		} catch (FuncionarioInvalidoException e) {
			request.setAttribute("mensagem", e.getMessage());
			return mapping.findForward("erro");
		} catch (ErroAcessoRepositorioException e) {
			request.setAttribute("mensagem", e.getMessage()+", "+e.getExcecaoInterna().getMessage());
			return mapping.findForward("erro");
		}
		return mapping.findForward("listar");
	}
	
	public ActionForward detalhar(ActionMapping mapping,ActionForm form, 
			HttpServletRequest request,	HttpServletResponse response){
		Funcionario f = null;
		try {
			f = Fachada.obterInstancia().consultarFuncionario(request.getParameter("cpf"));
			request.setAttribute("nome", f.getNome());
			request.setAttribute("rg", f.getRg());
			request.setAttribute("salario", f.getSalario());
			request.setAttribute("bairro", f.getEndereco().getBairro());
			request.setAttribute("cep", f.getEndereco().getCep());
			request.setAttribute("cidade", f.getEndereco().getCidade());
			request.setAttribute("complemento", f.getEndereco().getComplemento());
			request.setAttribute("numero", f.getEndereco().getNumero());
			request.setAttribute("rua", f.getEndereco().getRua());
			request.setAttribute("uf", f.getEndereco().getUf());
		} catch (FuncionarioInvalidoException e) {
			request.setAttribute("mensagem", e.getMessage());
			return mapping.findForward("erro");
		} catch (ErroAcessoRepositorioException e) {
			request.setAttribute("mensagem", e.getMessage()+", "+e.getExcecaoInterna().getMessage());
			return mapping.findForward("erro");
		}
		return mapping.findForward("formDetalhar");
	}
	
	public ActionForward inserir(ActionMapping mapping,ActionForm form, 
			HttpServletRequest request,	HttpServletResponse response){
		String nome = request.getParameter("nome");
		String cpf = request.getParameter("cpf");
		String rg = request.getParameter("rg");
		double salario = Double.parseDouble(request.getParameter("salario"));
		String rua = request.getParameter("rua");
		String numero = request.getParameter("numero");
		String complemento = request.getParameter("complemento");
		String bairro = request.getParameter("bairro");
		String cidade = request.getParameter("cidade");
		String cep = request.getParameter("cep");
		String uf = request.getParameter("uf");
		
		try {
			Fachada.obterInstancia().inserirFuncionario(new Funcionario(cpf,nome,rg,
					new Endereco(rua,numero,complemento,bairro,cidade,cep,uf),salario));
		} catch (FuncionarioExistenteException e) {
			request.setAttribute("mensagem", e.getMessage());
			return mapping.findForward("erro");
		} catch (ErroAcessoRepositorioException e) {
			request.setAttribute("mensagem", e.getMessage()+", "+e.getExcecaoInterna().getMessage());
			return mapping.findForward("erro");
		} catch (CampoObrigatorioException e) {
			request.setAttribute("mensagem", e.getMessage());
			return mapping.findForward("erro");
		}
		
		return mapping.findForward("listar");
	}

}
